﻿using SIIE_ERP.BaseDatos.Bancos.Catalogos;
using SIIE_ERP.Codigo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIIE_ERP.BaseDatos.PuntoVenta.Catalogos
{
    public class dbo_Cat_Terminal
    {
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion
        
        #region Constructores

        public dbo_Cat_Terminal(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion
        
        #region INSERT

        public Respuesta Insert_Terminal(
            int Id_Almacen,                        
            string Descripcion,
            int Id_Sucursal         
        )
        {
            try
            {
                DataTable AuxCuentaBancaria = new DataTable();
                DataTable AuxMoneda = new DataTable();

                int Id_Cuenta_Bancaria = -1;
                int Id_Moneda = -1;

                dbo_Cat_Cuenta_Bancaria cb = new dbo_Cat_Cuenta_Bancaria(this._RFC, this._Usuario);
                AuxCuentaBancaria = cb.Get_Cuentas_Bancarias();

                dbo_Cat_Moneda mon = new dbo_Cat_Moneda(this._RFC, this._Usuario);
                AuxMoneda = mon.Get_Moneda_Por_Nombre("Pesos Mexicanos");
                Id_Moneda = Int32.Parse(AuxMoneda.Rows[0]["Id_Moneda"].ToString());
                
                for (int i = 0; i < AuxCuentaBancaria.Rows.Count; i++) {

                    if (AuxCuentaBancaria.Rows[i]["Nombre"].ToString().Equals(Descripcion))
                    {
                        Id_Cuenta_Bancaria = Int32.Parse(AuxCuentaBancaria.Rows[i]["Id_Cuenta"].ToString());
                        break;
                    }
                }

                if (Id_Cuenta_Bancaria == -1)
                {                   
                    cb.Insert_Cuenta_Bancaria(Descripcion, "Cuenta asociada a la Terminal de Punto de Venta: " + Descripcion + ".", Id_Moneda);

                    AuxCuentaBancaria = cb.Get_Cuenta_Bancaria_Por_Nombre(Descripcion);
                    Id_Cuenta_Bancaria = Int32.Parse(AuxCuentaBancaria.Rows[0]["Id_Cuenta"].ToString());
                }

                string Query = @"INSERT INTO dbo_Cat_Terminal
                             (
                                Id_Terminal,
                                RFC,
                                Id_Almacen,
                                Id_CuentaBancaria,
                                Descripcion,
                                Id_Sucursal,
                                Is_Open,
                                Fecha_Alta,
                                Usuario_Alta,
                                Fecha_Mantto,
                                Usuario_Mantto
                             )
                             VALUES
                             (
                                IIF(DCount('*', 'dbo_Cat_Terminal') = 0, 1, DMax('Id_Terminal', 'dbo_Cat_Terminal') + 1),
                                '@@RFC',
                                @@Id_Almacen,
                                @@Id_CuentaBancaria,
                                '@@Descripcion',
                                @@Id_Sucursal,
                                1,
                                NOW(),
                                '@@Usuario_Alta',
                                NOW(),
                                '@@Usuario_Mantto'
                             )";

                Query = Query.Replace("@@RFC", this._RFC);
                Query = Query.Replace("@@Id_Almacen", Id_Almacen.ToString());
                Query = Query.Replace("@@Id_CuentaBancaria", Id_Cuenta_Bancaria.ToString());
                Query = Query.Replace("@@Descripcion", Descripcion.Replace("'", "''"));
                Query = Query.Replace("@@Id_Sucursal", Id_Sucursal.ToString());
                Query = Query.Replace("@@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }            
        }

        #endregion

        #region UPDATE

        public Respuesta Update_Terminal_Por_Id(
            object Id, 
            int Id_Almacen,
            string Descripcion,
            int Id_Sucursal,
            int Id_CuentaBancaria
        )
        {
            try
            {
                string Query = @"UPDATE dbo_Cat_Terminal SET
                                                                 
                                    Descripcion = '@@Descripcion',
                                    Id_Almacen = @@Id_Almacen,
                                    Id_Sucursal = @@Id_Sucursal,
                                    Id_CuentaBancaria = @@Id_CuentaBancaria
                                 WHERE Id_Terminal = @@Id";
                
                Query = Query.Replace("@@Descripcion", Descripcion);
                Query = Query.Replace("@@Id_Almacen", Id_Almacen.ToString());
                Query = Query.Replace("@@Id_Sucursal", Id_Sucursal.ToString());
                Query = Query.Replace("@@Id_CuentaBancaria", Id_CuentaBancaria.ToString());
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);
                Query = Query.Replace("@@Id", ((Int32)Id).ToString());

                return SrvDB.ExecuteQuery_Update(Query);
                
                
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public Respuesta Execute_Cerrar_Terminal()
        {
            string Query = @"UPDATE dbo_Trans_Apertura_Terminal SET Fecha_Cierre = NOW() WHERE Fecha_Cierre is NULL AND RFC = '@@RFC'";
            Query = Query.Replace("@@RFC", this._RFC);
            return SrvDB.ExecuteQuery_Update(Query);
        }

        #endregion

        #region DELETE

        public Respuesta Delete_Terminal_Por_Id(
            object Id
        )
        {
            try
            {
                string Query = @"DELETE FROM dbo_Cat_Terminal 
                                    WHERE Id_Terminal = @@Id";

                Query = Query.Replace("@@Id", ((Int32)Id).ToString());

                return SrvDB.ExecuteQuery_Delete(Query);
                
                
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        #endregion

        #region SELECT
        
        public DataTable Get_Terminal_Por_Id(object Id){

            string Query = @"SELECT 
                
                                A1.*,
								A2.Descripcion AS Desc_Almacen,
								A3.Nombre AS Desc_Sucursal
								
                            FROM ((dbo_Cat_Terminal AS A1
                            
                                INNER JOIN dbo_Cat_Almacen       AS A2 ON A1.Id_Almacen = A2.Id_Almacen)
                                INNER JOIN dbo_Cat_Sucursal       AS A3 ON A1.Id_Sucursal = A3.Id_Sucursal)
                              
                            WHERE A1.Id_Terminal = @@Id";
            Query = Query.Replace("@@Id", ((Int32)Id).ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Terminal_Por_Nombre(string Nombre)
        {

            string Query = @"SELECT 
                
                                A1.*,
								A2.Descripcion AS Desc_Almacen,
								A3.Nombre AS Desc_Sucursal,
								A4.Nombre AS Desc_CuentaBancaria
								
                            FROM (((dbo_Cat_Terminal AS A1
                            
                                INNER JOIN dbo_Cat_Almacen       AS A2 ON A1.Id_Almacen = A2.Id_Almacen)
                                INNER JOIN dbo_Cat_Sucursal       AS A3 ON A1.Id_Sucursal = A3.Id_Sucursal)
                                INNER JOIN dbo_Cat_Cuenta_Bancaria       AS A4 ON A1.Id_CuentaBancaria = A4.Id_Cuenta)
                            
                            WHERE A1.Nombre = '@@Nombre' AND A1.RFC = '@@RFC'";
            Query = Query.Replace("@@Nombre", Nombre.Replace("'", "''"));
            Query = Query.Replace("@@RFC", this._RFC);

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Terminales()
        {
            string Query = @"SELECT 
                
                                A1.*,
								A2.Descripcion AS Desc_Almacen,
								A3.Nombre AS Desc_Sucursal
								
                            FROM ((dbo_Cat_Terminal AS A1
                            
                                INNER JOIN dbo_Cat_Almacen       AS A2 ON A1.Id_Almacen = A2.Id_Almacen)
                                INNER JOIN dbo_Cat_Sucursal       AS A3 ON A1.Id_Sucursal = A3.Id_Sucursal)
                            WHERE A1.RFC = '@@RFC'";

            Query = Query.Replace("@@RFC", this._RFC);

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataRow Get_Terminal_Abierta()
        {
            string Query = @"SELECT A1.*,
                                    A3.Saldo as Saldo,
                                    A2.Id_CuentaBancaria as CuentaAsociada,
                                    A2.Id_Almacen as Almacen,
                                    A2.Id_Sucursal as Sucursal
                                 FROM 
                                 (( dbo_Trans_Apertura_Terminal as A1
                                    INNER JOIN dbo_Cat_Terminal as A2 ON A1.Id_Terminal = A2.Id_Terminal)
                                    INNER JOIN dbo_Cat_Cuenta_Bancaria as A3 ON A2.Id_CuentaBancaria = A3.Id_Cuenta)
                            
                            WHERE A1.Fecha_Cierre is NULL AND A1.RFC = '@@RFC'";

            Query = Query.Replace("@@RFC", this._RFC);

            var answer = SrvDB.ExecuteQuery_Get(Query);
            return answer.Rows.Count > 0 ? answer.Rows[0] : null;
        }

        #endregion
    }
}
